package ev.ftw.gff;

/**
 * Clase para trabajar con fragmentos reconocidos de un cromosoma con los atributos
 * necesarios para un fichero GFF.
 * 
 * @date 01.08.2012
 * @author Enrique Vázquez de Luis
 */
public class FragConocido extends Fragmento {

	/**
	 * Seqname, normalmente el cromosoma al que pertenece
	 */
	String cromosoma;
	
	/**
	 * Source, el programa origen de los datos
	 */
	String fuente;
	
	/**
	 * Feature, el tipo de característica del fragmento 
	 */
	String tipo;
	
	/**
	 * Score, intensidad con la que se debe mostrar.</br>
	 * Valores entre 0 y 1000. Si no importa será '.' (en el entero será '-1').
	 */
	int intensidad;
	
	/**
	 * Frame, si el tipo es exon este valor estará entre 0 y 2. Si no será '.' ('-1').
	 */
	int frame;
	
	/**
	 * Group, todos los fragmentos del mismo grupo deben llevar el mismo valor de este atributo.
	 */
	String grupo;
	
	/**
	 * Getter del atributo cromosoma
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @return el nombre del cromosoma al que hace referencia el fragmento.
	 */
	public String getCromosoma() {
		return cromosoma;
	}

	/**
	 * Setter del cromosoma del fragmento
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @param cromosoma El nombre del cromosoma
	 */
	public void setCromosoma(String cromosoma) {
		this.cromosoma = cromosoma;
	}

	/**
	 * Getter del origen de la identificación del fragmento.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @return El nombre de la fuente del fragmento
	 */
	public String getFuente() {
		return fuente;
	}

	/**
	 * Setter de la fuente del fragmento.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @param fuente Nombre de la fuente del fragmento
	 */
	public void setFuente(String fuente) {
		this.fuente = fuente;
	}

	/**
	 * Getter del tipo de fragmento.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @return El tipo de fragmento.
	 */
	public String getTipo() {
		return tipo;
	}

	/**
	 * Setter del tipo de fragmento.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @param tipo Tipo de fragmento.
	 */
	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	/**
	 * Getter de la intensidad con que se debe mostrar el fragmento.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @return La intensidad del fragmento.
	 */
	public int getIntensidad() {
		return intensidad;
	}

	/**
	 * Setter de la intensidad del fragmento.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @param intensidad Intensidad con que se debe mostrar el fragmento.
	 */
	public void setIntensidad(int intensidad) {
		if(intensidad > 1000) this.intensidad = 1000;
		else this.intensidad = intensidad;
	}
	
	/**
	 * Setter de la intensidad del fragmento
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @param intensidad Intensidad del fragmento. Puede ser '.'
	 */
	public void setIntensidad(String intensidad) {
		try{
			if(Integer.parseInt(intensidad) > 1000) this.intensidad = 1000;
			else this.intensidad = Integer.parseInt(intensidad);
		}catch (java.lang.NumberFormatException e){
			this.intensidad = -1;
		}
	}

	/**
	 * Getter del marco del fragmento.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @return El marco del fragmento.
	 */
	public int getFrame() {
		return frame;
	}


	/**
	 * Setter del marco del fragmento.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @param frame El marco del fragmento.
	 */
	public void setFrame(int frame) {
		this.frame = frame;
	}

	/**
	 * Setter del marco del fragmento.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @param frame El marco del fragmento.
	 */
	public void setFrame(String frame){
		try{
			this.frame = Integer.parseInt(frame);
		}catch (java.lang.NumberFormatException e){
			this.frame = -1;
		}
	}

	/**
	 * Getter del gruop del fragmento.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @return El grupo del fragmento.
	 */
	public String getGrupo() {
		return grupo;
	}

	/**
	 * Setter del grupo del fragmento.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @param grupo El grupo del Fragmento.
	 */
	public void setGrupo(String grupo) {
		this.grupo = grupo;
	}

	/**
	 * Constructor sin parámetros de un fragmento.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 */
	public FragConocido(){
		this.setDefaults();
	}
	
	/**
	 * Establece los atributos del fragmento a sus valores predefinidos.
	 * Estos valores se han obtenido del fichero gff del Sacharomyces Pombe
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 */
	public void setDefaults(){
		this.setCromosoma("Cromosoma");
		this.setFuente("PFC_SUP");
		this.setTipo("Fragmento Descubierto");
		this.setInicio(0);
		this.setFin(0);
		this.setIntensidad(100);
		this.setDireccion('+');
		this.setFrame(0);
		this.setGrupo("S/G");
	}
	
	/**
	 * Constructor de un FragConocido con los parámetros en un array de Strings
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @param parametros Los parámetros para la construcción, si no son 9 actúa como
	 * el constructor sin parámetros.
	 */
	public FragConocido(String [] parametros){
		if(parametros.length < 9) this.setDefaults();
		else {
			this.setCromosoma(parametros[0]);
			this.setFuente(parametros[1]);
			this.setTipo(parametros[2]);
			this.setInicio(Integer.parseInt(parametros[3]));
			this.setFin(Integer.parseInt(parametros[4]));
			this.setIntensidad(parametros[5]);
			this.setDireccion(parametros[6].charAt(0));
			this.setFrame(parametros[7]);
			this.setGrupo(parametros[8]);
		}
	}
	
	/**
	 * Constructor con los 9 parámetros en tipo cadena que se necesitan para crear un objeto
	 * del tipo FragConocido.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @param cromosoma El cromosoma al que hace referencia.
	 * @param fuente El programa con el que se ha obtenido.
	 * @param tipo El tipo de fragmento.
	 * @param inicio El inicio del fragmento.
	 * @param fin El fin del fragmento.
	 * @param intensidad La intensidad con que debe mostrarse.
	 * @param direccion La dirección de lectura del cromosoma dónde se ha encontrado.
	 * @param frame El marco del fragmento.
	 * @param grupo El grupo del fragmento.
	 */
	public FragConocido(String cromosoma, String fuente, String tipo, String inicio, String fin, String intensidad, String direccion, String frame, String grupo){
		this.setCromosoma(cromosoma);
		this.setFuente(fuente);
		this.setTipo(tipo);
		this.setInicio(Integer.parseInt(inicio));
		this.setFin(Integer.parseInt(fin));
		this.setIntensidad(intensidad);
		this.setDireccion(direccion.charAt(0));
		this.setFrame(frame);
		this.setGrupo(grupo);
	}

	/**
	 * Constructor con los 9 parámetros que se necesitan para crear un objeto
	 * del tipo FragConocido.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @param cromosoma El cromosoma al que hace referencia.
	 * @param fuente El programa con el que se ha obtenido.
	 * @param tipo El tipo de fragmento.
	 * @param inicio El inicio del fragmento.
	 * @param fin El fin del fragmento.
	 * @param intensidad La intensidad con que debe mostrarse.
	 * @param direccion La dirección de lectura del cromosoma dónde se ha encontrado.
	 * @param frame El marco del fragmento.
	 * @param grupo El grupo del fragmento.
	 */
	public FragConocido(String cromosoma, String fuente, String tipo, int inicio, int fin, int intensidad, char direccion, int frame, String grupo){
		this.setCromosoma(cromosoma);
		this.setFuente(fuente);
		this.setTipo(tipo);
		this.setInicio(inicio);
		this.setFin(fin);
		this.setIntensidad(intensidad);
		this.setDireccion(direccion);
		this.setFrame(frame);
		this.setGrupo(grupo);
	}
	
	/**
	 * Constructror a través de un objeto del tipo Fragmento. <br>
	 * Establece los atributos a su valor por defecto y luego cambia los que aparecen en el
	 * objeto tomado como base.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @param f El fragmento tomado como base.
	 */
	public FragConocido(Fragmento f){
		this.setDefaults();
		this.setInicio(f.getInicio());
		this.setFin(f.getFin());
		this.setDireccion(f.getDireccion());
	}
	
	/**
	 * Función para pasar el cromosoma a formato texto siguiendo la forma de un fichero GFF.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 */
	public String toString(){
		String salida = "";
		salida += this.cromosoma + "\t" + this.fuente + "\t" + this.tipo + "\t";
		salida += this.inicio + "\t" + this.fin + "\t";
		if(this.intensidad >= 0) salida += this.intensidad;
		else salida += ".";
		salida += "\t" + this.direccion + "\t";
		if(this.frame >= 0) salida += this.frame;
		else salida += ".";
		salida += "\t" + this.grupo;
		
		return salida;
	}
}
